GBAでHello World
組み込みプログラミングの勉強のため「Linuxから目覚めるぼくらのゲームボーイ」を読んでいる。
本書ではLinuxを使ってクロス開発環境を構築しているのだけど、手元のMacとDockerで開発環境を構築できたのでその手順をまとめた。
事前準備
GBA用のgccを用意
code:sh
# GBA開発用のDockerイメージをpullする
$ docker pull devkitpro/devkitarm
# Docker環境の中でbashを起動
$ docker run -it --rm -v $PWD:/source -w /source devkitpro/devkitarm /bin/bash
(Dockerの中)
$ $DEVKITARM/bin/arm-none-eabi-gcc --version
arm-none-eabi-gcc (devkitARM release 56) 11.1.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$
サンプルプログラムをビルド
code:dots.s
# My first GBA video drawing program
.arm
.text
ldr r2, =0xF03 @ Set video mode 3
strh r2, r1 @ Update display control register ldr r4, =0x7FFF @ RGB = 1F/1F/1F --> white
loop:
b loop
リンカスクリプト。
code:simple.ls
OUTPUT_ARCH(arm)
SECTIONS {
.text 0x02000000 : { *(.text) }
}
Dockerイメージの中で以下の手順でビルドする。
code:sh
$ /opt/devkitpro/devkitARM/bin/arm-none-eabi-as -o dots.o dots.s
$ /opt/devkitpro/devkitARM/bin/arm-none-eabi-ld -o dots.out -T simple.ls dots.o
$ /opt/devkitpro/devkitARM/bin/arm-none-eabi-objcopy -O binary dots.out dots.bin
実機へ転送
作成した dots.bin をGBA実機へ転送する。実機への転送はDockerではなくMac側で行う。
GBAの本体の電源を投入し、以下のコマンドを入力する。
code:sh
$ cd ~/src/GBA
$ sudo optusb/optusb dots.bin
=== optusb v1.01 ===
Source file = dots.bin
Program size = 48
Status = Successfully transferred.
プログラムが転送されて、GBAの実機に以下のドットが表示される。
https://gyazo.com/01881edbfca75f5948b284abc02f1ce0
(以下は補足)
$DEVKITARM/binにパスを通す
デフォルトでは/opt/devkitpro/devkitARM/binにパスが通ってないので少し不便なのでパスを通したい。
Docker内で定義したい環境変数を定義するファイル env を作成し、
code:env
PATH=/opt/devkitpro/devkitARM/bin:/opt/devkitpro/tools/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
--env-fileでenvファイルを渡してdocker runを起動すればOK
code:sh
$ docker run -it --rm -v $PWD:/root -w /root --env-file env devkitpro/devkitarm /bin/bash
パスが通ったので以下のコマンドでビルドできる。
code:sh
$ arm-none-eabi-as -o dots.o dots.s
$ arm-none-eabi-ld -o dots.out -T simple.ls dots.o
$ arm-none-eabi-objcopy -O binary dots.out dots.bin
生成されたバイナリを逆アセンブル
objdumpで生成された dots.bin を逆アセンブルしてみる。
-b binary
ファイル形式は単純バイナリ
-m arm
対象アーキテクチャはArm
--adjust-vma=0x02000000
プログラム開始アドレスは0x02000000
code:sh
$ /opt/devkitpro/devkitARM/bin/arm-none-eabi-objdump -D -b binary -m arm --adjust-vma=0x02000000 dots.bin
dots.bin: file format binary
Disassembly of section .data:
02000000 <.data>:
2000000: e3a01301 mov r1, #67108864 ; 0x4000000 2000004: e59f201c ldr r2, pc, #28 ; 0x2000028 2000008: e1c120b0 strh r2, r1 2000010: e59f4014 ldr r4, pc, #20 ; 0x200002c 2000014: e1c340b0 strh r4, r3 2000018: e1c340b4 strh r4, r3, #4 200001c: e1c340b8 strh r4, r3, #8 2000024: eafffffe b 0x2000024
2000028: 00000f03 andeq r0, r0, r3, lsl #30 200002c: 00007fff strdeq r7, r0, -pc ; <UNPREDICTABLE> 参考
devkitPro
Getting Started / devkitPro
macOS and linux pacman binaries for devkitPro provided libraries.
docker
devkitpro/devkitarm を使えば良さそう
MacでのGBA実機転送はこの記事を参考にした
情報システム実験 : 組み込みオペレーティングシステム 環境構築
サンプルプログラム
最近ではdevkitProを使うのが良いみたい
Introduction to GBA Programming in VS Code
https://youtu.be/Rj0lf46iljc
プログラミング講座C言語編第1回ゲームボーイアドバンスでC言語を勉強しよう!その1.開発環境構築
https://youtu.be/cYoNlcPsMCU
覚え書き
export PATH=$DEVKITARM/bin:$PATH